跳到主要内容

MySQL 的查询语句~

查询语句的执行顺序

classDiagram from 表名 --> where 筛选条件 where 筛选条件 --> group_by分组列表 group_by分组列表-->select 查询列表or分组函数 select 查询列表or分组函数-->having筛选分组 having筛选分组-->order_by排序

条件查询

  • 按条件表达式筛选:条件运算符 > , < , = , != , >= , <= , <>
  • 按逻辑表达式筛选:逻辑运算符 && || ! and or not
select 字段名 from 表名  where 字段 > 1200;
select 字段名 from 表名  where 字段 > 1200 and 字段 < 3000;

还有一些用来简化上面的关键字 between and , in , is null ,is not null

-- 查询员工编号在100到120之间的员工信息
select * from 表名 where id > 100 and id < 120;

-- 使用between and
select * from 表名 where id between 100 and 120;

-- 查询员工的工种编号是 123 或 321 或 456 的员工信息
select * from 表名 where id = 123 or id = 321 or = 456;

-- 使用 in
select * from 表名 where id in (123,321,456);

模糊查询

模糊查询的关键字:like

模糊查询使用的通配符

  • %:表示任意个字符
  • _:表示一个字符 (如果要查找的字段本身带有_则使用转义符例:'_a\_%')
select 字段名 from 表名  where 字段 like '_a_b_c%';

查询结果排序

语法:

select 查询列表,
from
(where 筛选条件)
order by 排序列表(asc|desc) -- 默认是升序
  • 可以支持单个字段,多个字段,表达式,函数,别名
  • order by 子句一般是放在查询语句的最后面

使用例:

# 按年薪的高低显示员工的信息和年薪
select * , salary*12*(1+ifnull(提成,0)) as 年薪 fromorder by 年薪 desc;
# 查询员工信息,先按工资排序,再按员工id排序
select * fromorder by 工资,id desc;

对结果进行分组

语法:

select 分组函数 -- 这里只能使用分组函数,和用来分组的字段
from
[where 筛选条件]
group by 分组列表
[order by 排序列表(asc|desc)]

使用例:

20200402171211.png

# 查询出版社里的最贵的书
select max(price) as '出版社里最贵的' ,publish
from book
group by publish
order by '出版社里最贵的' desc;

20200402171324.png

分组后的筛选

having 关键字是对 group by 之后的结果进行筛选

-- 查询哪个部门的员工数 > 2
-- 分步骤 1.查询每个部门的员工数 2.根据1的结果进行筛选
select count(*) as 员工数,部门
from
group by 部门
having 员工数 > 2;

连接查询

又称为多表查询,当查询的字段来自于多个表时,就会用到连接查询

select 查询列表
from1 别名 [连接类型]
join2 别名 on 连接条件
[where 筛选条件]
[group by 分组列表]
[having 筛选条件]
[order by 排序列表(asc|desc)]
  • 内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留
  • 外连接(outer join):取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL

内连接

又称为简单连接,或者自然连接,是一种常见的连接查询 内连接使用比较运算符,对两个表中的数据,进行比较,并列出与连接条件匹配的数据行,组合成新的记录。

在内连接查询中,只有满足条件的记录,才会出现在查询结果中

-- 语法格式
SELECT 查询字段 FROM1 [INNER] JOIN2 ON1.关系字段=2.关系字段;

INNER JOIN 关键字用于连接两个表,其中 INNER 可以省略

内连接分为 等值连接非等值连接

等值连接

  1. 多表等值连接的结果为多表的交集部分(珍珠项链的珍珠)
  2. n 表连接,至少需要 n-1 个连接条件
  3. 多表顺序没有要求
-- 查询员工名,部门名
select 员工名, 部门名
from 员工表 e
inner join 部门表 d
on e.id = d.id;

非等值连接

-- 工资位于 1000(low) 到 3000(higt) 的员工
select *
from 员工表 e
inner join 工资表 g
on e.工资 between g.low and g.higt;

外连接

以某一个表为主表,进行关联查询,不管能不能关联的上,主表的数据都会保留,关联不上的以 NULL 显示(用于查询一个表有,另一个表没有的记录)

通俗解释就是:先拿出主表的所有数据,然后到关联的那张表去找有没有符合关联条件的数据,如果有,正常显示,如果没有,显示为 NULL

外连接又分左外连接(left 左边的是主表),右外连接(right 右边是主表)

  • 外连接的查询结果为主表中的所有记录
  • 如果从表没有相匹配的则显示 null
  • 外连接查询结果 = 内连接结果 + 主表中有而从表没有的记录

使用例:

女生表 g: 20200403154536.png

男生表 b: 20200403154550.png

-- 找没有男朋友的女生
select g.*
from 女生表 g -- 主表
left outer join 男生表 b
on g.男朋友id=b.id
where b.id is null;

结果:

20200403154509.png

子查询

出现在其他语句中的 select 语句,称为子查询或内查询(所以外部的查询语句称为主查询或外查询)

select 名字 
from 员工表
where 部门id in
(
select 部门id
from 部门表
where 位置id=1700
)

limit 关键字的妙用~

查询数据时,可能会查询出很多的记录。而用户需要的记录可能只是很少的一部分。这样就需要来限制查询结果的数量。Limit 是 MySQL 中的一个特殊关键字。Limit 子句可以对查询结果的记录条数进行限定,控制它输出的行数。

分页查询

-- 语法:
select 查询列表
from1 别名 [连接类型]
[join type] join2 别名 on 连接条件
[where 筛选条件]
[group by 分组列表]
[having 筛选条件]
[order by 排序列表(asc|desc)]
limit offset , size

它的两个参数:

  • offset:要显示的条目起始索引(从0开始)
  • size:要显示的条目个数

限制结果数量

-- m:表示查询多少条记录。
LIMIT m;

查询用户信息表(tb_user),按照 user_id 编号进行升序排列,显示前 5条记录。

SELECT * FROM tb_user
ORDER BY user_id
LIMIT 5

这样它就会查询出前五条数据,而到了 MyBatis 这里也可以通过它避免出现多条结果

@Repository("brandMapper")
public interface BrandMapper extends Mapper<Brand> {
/**
* 根据id查询品牌信息,这里通过 limit 关键字限制结果的数量~
*
* @param id
* @return
*/
@Select("select * from tb_brand where id = #{id} limit 1")
Brand findById(Integer id);
}

联合查询

应用场景:需要将多条查询语句的结果合并成一个结果

查询语句1
union
查询语句2
union
查询语句3
union